package cn.lili.common.utils;

import com.xkcoding.http.util.MapUtil;
import lombok.Setter;

import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * <p>
 * 构造URL
 * </p>
 *
 * @author yangkai.shen (https://xkcoding.com)
 * @since 1.9.0
 */
@Setter
public class UrlBuilder {

	private final Map<String, String> params = new LinkedHashMap<>(7);
	private String baseUrl;

	private UrlBuilder() {

	}

	/**
	 * @param baseUrl
	 *            基础路径
	 * @return the new {@code UrlBuilder}
	 */
	public static UrlBuilder fromBaseUrl(String baseUrl) {
		UrlBuilder builder = new UrlBuilder();
		builder.setBaseUrl(baseUrl);
		return builder;
	}

	/**
	 * 只读的参数Map
	 *
	 * @return unmodifiable Map
	 * @since 1.15.0
	 */
	public Map<String, Object> getReadOnlyParams() {
		return Collections.unmodifiableMap(params);
	}

	/**
	 * 添加参数
	 *
	 * @param key
	 *            参数名称
	 * @param value
	 *            参数值
	 * @return this UrlBuilder
	 */
	public UrlBuilder queryParam(String key, Object value) {
		if (StringUtils.isEmpty(key)) {
			throw new RuntimeException("参数名不能为空");
		}
		String valueAsString = (value != null ? value.toString() : null);
		this.params.put(key, valueAsString);

		return this;
	}

	/**
	 * 添加参数
	 *
	 * @param value
	 *            参数值
	 * @return this UrlBuilder
	 */
	public UrlBuilder pathAppend(String value) {
		if (StringUtils.isEmpty(value)) {
			throw new RuntimeException("参数不能为空");
		}
		this.setBaseUrl(this.baseUrl += value);
		return this;
	}

	/**
	 * 构造url
	 *
	 * @return url
	 */
	public String build() {
		return this.build(false);
	}

	/**
	 * 构造url
	 *
	 * @param encode
	 *            转码
	 * @return url
	 */
	public String build(boolean encode) {
		if (MapUtil.isEmpty(this.params)) {
			return this.baseUrl;
		}
		String baseUrl = StringUtils.appendIfNotContain(this.baseUrl, "?", "&");
		String paramString = MapUtil.parseMapToString(this.params, encode);
		return baseUrl + paramString;
	}
}
